home *** CD-ROM | disk | FTP | other *** search
- #include <SetupA4.h>
- #include "ExternalInterface.h"
- #include "DialogUtilities.h"
-
-
- #define MAC2ISO 2
- #define MAC2SCAND 3
- #define ISO2MAC 10
- #define SCAND2MAC 11
- #define INPLACE 4
- #define NEWWIN 5
- #define CLIPB 6
- #define CANCEL 9
- #define CONVERT 1
-
- static void Convert2Scand(Handle text, long start, long end, long offset);
- static void Convert2ISO(Handle text, long start, long end, long offset);
- static void ConvertISO2Mac(Handle text, long start, long end, long offset);
- static void ConvertScand2Mac(Handle text, long start, long end, long offset);
-
- static struct _charsetoptions
- {
- enum {Mac2ISO, Mac2Scand, ISO2Mac, Scand2Mac} conversion;
- enum {inPlace, newWin, clipBoard} destination;
- } charsetOptions;
-
- static Boolean nonEmptySelection;
-
- void maintainButtons(DialogPtr d)
- {
- SetDlgCtl(d, MAC2ISO, charsetOptions.conversion == Mac2ISO);
- SetDlgCtl(d, MAC2SCAND, charsetOptions.conversion == Mac2Scand);
- SetDlgCtl(d, ISO2MAC, charsetOptions.conversion == ISO2Mac);
- SetDlgCtl(d, SCAND2MAC, charsetOptions.conversion == Scand2Mac);
-
- SetDlgCtl(d, INPLACE, charsetOptions.destination == inPlace);
- SetDlgCtl(d, NEWWIN, charsetOptions.destination == newWin);
- SetDlgCtl(d, CLIPB, charsetOptions.destination == clipBoard);
- }
-
- pascal void main(ExternalCallbackBlock *callbacks, WindowPtr w)
- {
- DialogPtr d;
- short item;
- GrafPtr save_port;
- long selStart, selEnd, firstChar;
-
- short act_len;
-
- OSErr err;
-
- RememberA0();
- SetUpA4();
-
- callbacks->GetPreference('CCST', sizeof(struct _charsetoptions), &charsetOptions, &act_len);
-
- if (act_len < 0)
- {
- charsetOptions.conversion = Mac2ISO;
- charsetOptions.destination = inPlace;
- }
-
- GetPort(&save_port);
- d = callbacks->CenterDialog(128);
- SetPort(d);
-
- callbacks->GetSelection(&selStart, &selEnd, &firstChar);
- nonEmptySelection = (selEnd > selStart);
-
- do
- {
- maintainButtons(d);
-
- ModalDialog(callbacks->StandardFilter, &item);
-
- switch (item)
- {
- case MAC2ISO:
- charsetOptions.conversion = Mac2ISO;
- break;
- case MAC2SCAND:
- charsetOptions.conversion = Mac2Scand;
- break;
- case ISO2MAC:
- charsetOptions.conversion = ISO2Mac;
- break;
- case SCAND2MAC:
- charsetOptions.conversion = Scand2Mac;
- break;
- case INPLACE:
- charsetOptions.destination = inPlace;
- break;
- case NEWWIN:
- charsetOptions.destination = newWin;
- break;
- case CLIPB:
- charsetOptions.destination = clipBoard;
- break;
- }
- } while ((item != CONVERT) && (item != CANCEL));
-
- DisposDialog(d);
- SetPort(save_port);
-
- if (item == CONVERT)
- {
- Handle h, text;
- long textLen;
- long changeStart, changeEnd;
- long offset;
- long extendLengthBy;
- WindowPtr wp;
-
- callbacks->SetPreference('CCST', sizeof(struct _charsetoptions), &charsetOptions, &act_len);
-
- h = callbacks->GetWindowContents(w);
- textLen = GetHandleSize(h);
- if (!nonEmptySelection)
- {
- changeStart = 0;
- changeEnd = textLen;
- }
- else
- {
- changeStart = selStart;
- changeEnd = selEnd;
- }
-
- if (charsetOptions.destination == clipBoard || charsetOptions.destination == newWin) {
- text = callbacks->Allocate(changeEnd-changeStart, FALSE);
- if (text == NULL) {
- callbacks->ReportOSError(memFullErr);
- goto done;
- }
- BlockMove(*h + changeStart, *text, changeEnd-changeStart);
- offset = 0;
- } else {
- text = h;
- offset = changeStart;
- }
- switch (charsetOptions.conversion) {
- case Mac2ISO:
- Convert2ISO(text, changeStart, changeEnd, offset);
- break;
- case Mac2Scand:
- Convert2Scand(text, changeStart, changeEnd, offset);
- break;
- case ISO2Mac:
- ConvertISO2Mac(text, changeStart, changeEnd, offset);
- break;
- case Scand2Mac:
- ConvertScand2Mac(text, changeStart, changeEnd, offset);
- break;
- }
-
- if (charsetOptions.destination == inPlace) {
- callbacks->ContentsChanged(w);
- callbacks->SetSelection(selStart, selEnd, firstChar);
- } else if (charsetOptions.destination == newWin) {
- wp = callbacks->NewDocument();
- callbacks->SetWindowContents(wp, text);
- callbacks->SetSelection(selStart, selEnd, firstChar);
- /* text-handle belongs to the new window, don't dispose */
- } else {
- HLock(text);
- ZeroScrap();
- PutScrap(changeEnd - changeStart, 'TEXT', *text);
- DisposHandle(text); /* obsolete, free it */
- }
-
- }
- done:
- RestoreA4();
- }
-
- static void Convert2ISO(Handle text, long start, long end, long offset)
- {
- long len = end - start;
- long i;
- char *p = *text + offset;
-
- for (i = 0; i < len; i++)
- switch (p[i]) {
- case '\307':
- p[i] = '\253';
- break;
- case '\310':
- p[i] = '\273';
- case '\246':
- p[i] = '\266';
- break;
- case '\244':
- p[i] = '\247';
- break;
- case '\347':
- p[i] = '\301';
- break;
- case '\207':
- p[i] = '\341';
- break;
- case '\200':
- p[i] = '\304';
- break;
- case '\212':
- p[i] = '\344';
- break;
- case '\313':
- p[i] = '\300';
- break;
- case '\210':
- p[i] = '\340';
- break;
- case '\256':
- p[i] = '\306';
- break;
- case '\276':
- p[i] = '\346';
- break;
- case '\201':
- p[i] = '\305';
- break;
- case '\214':
- p[i] = '\345';
- break;
- case '\203':
- p[i] = '\311';
- break;
- case '\216':
- p[i] = '\351';
- break;
- case '\205':
- p[i] = '\326';
- break;
- case '\232':
- p[i] = '\366';
- break;
- case '\257':
- p[i] = '\330';
- break;
- case '\277':
- p[i] = '\370';
- break;
- case '\206':
- p[i] = '\334';
- break;
- case '\237':
- p[i] = '\374';
- break;
- default:
- break;
- }
- }
-
- static void ConvertISO2Mac(Handle text, long start, long end, long offset)
- {
- long len = end - start;
- long i;
- char *p = *text + offset;
-
- for (i = 0; i < len; i++)
- switch (p[i]) {
- case '\253':
- p[i] = '\307';
- break;
- case '\273':
- p[i] = '\310';
- case '\266':
- p[i] = '\246';
- break;
- case '\247':
- p[i] = '\244';
- break;
- case '\301':
- p[i] = '\347';
- break;
- case '\341':
- p[i] = '\207';
- break;
- case '\304':
- p[i] = '\200';
- break;
- case '\344':
- p[i] = '\212';
- break;
- case '\300':
- p[i] = '\313';
- break;
- case '\340':
- p[i] = '\210';
- break;
- case '\306':
- p[i] = '\256';
- break;
- case '\346':
- p[i] = '\276';
- break;
- case '\305':
- p[i] = '\201';
- break;
- case '\345':
- p[i] = '\214';
- break;
- case '\311':
- p[i] = '\203';
- break;
- case '\351':
- p[i] = '\216';
- break;
- case '\326':
- p[i] = '\205';
- break;
- case '\366':
- p[i] = '\232';
- break;
- case '\330':
- p[i] = '\257';
- break;
- case '\370':
- p[i] = '\277';
- break;
- case '\334':
- p[i] = '\206';
- break;
- case '\374':
- p[i] = '\237';
- break;
- default:
- break;
- }
- }
-
-
- static void Convert2Scand(Handle text, long start, long end, long offset)
- {
- long len = end - start;
- long i;
- char *p = *text + offset;
-
- for (i = 0; i < len; i++)
- switch (p[i]) {
- case '\200':
- p[i] = '[';
- break;
- case '\212':
- p[i] = '{';
- break;
- case '\201':
- p[i] = ']';
- break;
- case '\214':
- p[i] = '}';
- break;
- case '\203':
- p[i] = '@';
- break;
- case '\216':
- p[i] = '`';
- break;
- case '\205':
- p[i] = '\\';
- break;
- case '\232':
- p[i] = '|';
- break;
- case '\334':
- p[i] = '^';
- break;
- case '\374':
- p[i] = '~';
- break;
- default:
- break;
- }
- }
-
- static void ConvertScand2Mac(Handle text, long start, long end, long offset)
- {
- long len = end - start;
- long i;
- char *p = *text + offset;
-
- for (i = 0; i < len; i++)
- switch (p[i]) {
- case '[':
- p[i] = '\200';
- break;
- case '{':
- p[i] = '\212';
- break;
- case ']':
- p[i] = '\201';
- break;
- case '}':
- p[i] = '\214';
- break;
- case '@':
- p[i] = '\203';
- break;
- case '`':
- p[i] = '\216';
- break;
- case '\\':
- p[i] = '\205';
- break;
- case '|':
- p[i] = '\232';
- break;
- case '^':
- p[i] = '\334';
- break;
- case '~':
- p[i] = '\374';
- break;
- default:
- break;
- }
- }
-